// 封装axios
import axios from 'axios';
import qs from 'qs';
import {Message} from 'element-ui'; //引入ui组件
import storage from '@/utils/local' //localStorage操作方法

// 服务器地址 写上以后 所有的请求 会自动在前面拼接这个地址
// axios.defaults.baseURL = "http://172.16.6.254:5000";
// axios.defaults.timeout = 1000; // 超时

// 创建一个axios对象
const instance = axios.create({
    baseURL: 'http://127.0.0.1:5000', //公共url
    timeout: 5000, //超时时间
});

//创建拦截器
//请求拦截器
instance.interceptors.request.use(
  function (config) {
    // 在发送请求之前做些什么
    console.log('进入到了请求拦截器...')
    // 请求拦截器统一携带token，每个接口需要
    let token = storage.get("t_k") || ""; //获取本地保存的token
    if(token){
        config.headers.Authorization = token; // 统一在请求头携带token
    }
    return config;
  }, 
  function (error) {
    // 对请求错误做些什么
    return Promise.reject(error);
  }
);

//响应拦截器
instance.interceptors.response.use(
    function (response) {
        // 响应成功：对响应数据做点什么
        // 统一展示消息提示
        if (response.data.code !== undefined && response.data.msg !== undefined) {
            let {code,msg} = response.data; //只去状态码和消息文本
            Message({
                type:code == 0 ? 'success': "error",
                message:msg
            })
        }
        return response;
    }, 
    function (error) {
        // 响应有异常(错误)：对响应错误做点什么
        console.log('进入到了响应拦截器...',error)
        //全局的显示错误信息
        Message({
            type:"error",
            message:error.message
        })
        //返回
        return Promise.reject(error);
    }
);

//定义get方法,发送get请求
//返回ajax 工具对象
export default {
    // function:get(){}
    //promise版本,配合 async + await
     /**
     * @description 封装发送get请求方法
     * @param url String 请求的url
     * @param params Object 请求时候携带的数据，是一个json对象 {key:val,key2:val2,...}}
     */
    get(url,params={}){
        return new Promise(function(resolve,reject){
            //返送异步请求
            instance.get(url,{params:params})
            .then(function(res){
                console.log("ok",res)//请求成功时调用
                resolve(res.data)//取axios 返回的接口数据（他是在data里面）
            })
            .catch(function(err){
                reject(err)//请求失败时调用
            })
        });
    },

    //post请求
    /**
     * @description 封装发送post请求方法,使用qs把对象( {k:v} )转为 -> k=v&k2=v2 表单提交数据形式
     * @param url String 请求的url
     * @param params Object 请求时候携带的数据，是一个json对象 {key:val,key2:val2,...}}
     */
    post(url,params={}){
       return new Promise((resolve,reject)=>{
            //qs qs.stringify({k:v}) -> k=v&k2=v2
            //接口 接收数据 的方式是 默认表单的提交方式:application/x-www-form-urlencoded
            instance.post(url,qs.stringify(params))
            .then(function(res){
                console.log("from request.js,post ok",res)
                resolve(res.data) //取axios 返回的接口数据（他是在data里面）
            })
            .catch(function(err){
                console.log(err)
                reject(err)
            })
       })
    }
}